#include "camera.h"


//////////////////////////////////////////////////
//  Camera::Camera()
//////////////////////////////////////////////////
 Camera::Camera() :
    angle(Camera::ANGLE_NW),
    moveFriction(0.75),
    moveSpeed(32),
    maxMoveSpeed(64),
    zoomLevel(5),
    zoomFactor(0.5)
 {
    dimensions.x = 800;
    dimensions.y = 600;
    view.reset(sf::FloatRect(pos.x, pos.y, dimensions.x, dimensions.y));
    view.setViewport(sf::FloatRect(0.0f, 0.0f, 1.0f, 1.0f));
 }

//////////////////////////////////////////////////
//  void Camera::eventHandle(sf::Event event)
//////////////////////////////////////////////////
void Camera::eventHandle(sf::Event event)
{
    if (event.type == sf::Event::KeyPressed)
    {
        if (event.key.code == sf::Keyboard::Left)
        {
                rotateCCW();
        }
        else if (event.key.code == sf::Keyboard::Right)
        {
                rotateCW();
        }
        else if (event.key.code == sf::Keyboard::Dash)
        {
                zoomOut();
        }
        else if (event.key.code == sf::Keyboard::Equal)
        {
                zoomIn();
        }
    }
}

//////////////////////////////////////////////////
//  void Camera::inputHandle()
//////////////////////////////////////////////////
void Camera::inputHandle()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        panUp();
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
    {
        panDown();
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
    {
        panLeft();
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
    {
        panRight();
    }
}

//////////////////////////////////////////////////
//  void Camera::update(double dt)
//////////////////////////////////////////////////
void Camera::update(double dt)
{
    inputHandle();

    // Clamp speed
    if (vel.x > maxMoveSpeed)
    {
        vel.x = maxMoveSpeed;
    }
    else if (vel.x < -maxMoveSpeed)
    {
        vel.x = -maxMoveSpeed;
    }

    if (vel.y > maxMoveSpeed)
    {
        vel.y = maxMoveSpeed;
    }
    else if (vel.y < -maxMoveSpeed)
    {
        vel.y = -maxMoveSpeed;
    }

    // Update position
    pos.x += vel.x;
    pos.y += vel.y;

    // Move the view
    view.move(vel.x, vel.y);

    // Apply friction
    vel.x *= moveFriction;
    vel.y *= moveFriction;

}

//////////////////////////////////////////////////
//  void Camera::zoomIn()
//////////////////////////////////////////////////
void Camera::zoomIn()
{
    view.zoom(zoomFactor);
    zoomLevel *= 2;
    printf("%f\n", zoomLevel);
}

//////////////////////////////////////////////////
//  void Camera::zoomOut()
//////////////////////////////////////////////////
void Camera::zoomOut()
{
    if (zoomLevel > 0)
    {
        view.zoom(1 + zoomFactor);
        zoomLevel *= 0.5;
    }
    printf("%f\n", zoomLevel);
}

//////////////////////////////////////////////////
//  void Camera::panLeft()
//////////////////////////////////////////////////
void Camera::panLeft()
{
    vel.x -= moveSpeed/zoomLevel;
}

//////////////////////////////////////////////////
//  void Camera::panRight()
//////////////////////////////////////////////////
void Camera::panRight()
{
    vel.x += moveSpeed/zoomLevel;
}

//////////////////////////////////////////////////
//  void Camera::panUp()
//////////////////////////////////////////////////
void Camera::panUp()
{
    vel.y -= moveSpeed/zoomLevel;
}

//////////////////////////////////////////////////
//  void Camera::panDown()
//////////////////////////////////////////////////
void Camera::panDown()
{
    vel.y += moveSpeed/zoomLevel;
}

//////////////////////////////////////////////////
//  void Camera::rotateCW()
//////////////////////////////////////////////////
void Camera::rotateCW()
{
    int iAngle = (int)angle;
    iAngle++;

    if (iAngle > (int)ANGLE_SW)
    {
        iAngle = (int)ANGLE_NW;
    }

    angle = (Camera::ViewAngle)iAngle;
}

//////////////////////////////////////////////////
//  void Camera::rotateCCW()
//////////////////////////////////////////////////
void Camera::rotateCCW()
{
    int iAngle = (int)angle;
    iAngle--;

    if (iAngle < (int)ANGLE_NW)
    {
        iAngle = (int)ANGLE_SW;
    }

    angle = (Camera::ViewAngle)iAngle;
}
